#include <iostream>
#include <string>
#include "Array.h"

using namespace std;

/*========================================new&delete=========================================================*/
// class Box{
// public:
//     int length;
//     int width;
//     int height;

//     Box(){
//         cout<<"Default constructor called."<<endl;
//     }

//     Box(int l, int w, int h) : length(l), width(w), height(h) {
//         cout << "Box created with dimensions" << endl;
//     }

//     ~Box() {
//         cout << "Box destroyed." << endl;
//     }
// };

// int main(){
//     bool a;
//     int *p = new int(10);// dynamic memory allocation在堆上申请一个int类型的内存，并将堆空间的内容初始化为10

//     int *p1 = new int[4];// dynamic memory allocation在堆上申请4个int类型的内存，返回值是一个指向第一个int类型内存的指针
//     for(int i = 0;i < 4;i++){
//         cout << p1[i] << endl;
//     }
//     cout << sizeof(a)<<endl;
    
//     Box *p3 = new Box[3];
//     Box *p4 = new Box(10,10,10);


//     return 0;
// }

/*=============================================使用已构造的对象初始化新的对象====================================================*/
// class Test{
//     public:
//         int* sum;
//         int x;
//         int y;

//         Test(){
//             cout << "Test()" << endl;
//             x = 0;
//             y = 0;
//             sum = new int[4];
//         }

//         Test(int a, int b):x(a), y(b) {
//             cout << "Test(int a, int b)" << endl;
//             sum = new int[4];
//         }

//         ~Test(){
//             cout << "~Test()" << endl;
//             delete[] sum; // 释放动态分配的内存
//         }
// };

// int main(){
//     // Test t1(10, 20);
//     // t1.sum[0] = 10;
//     // t1.sum[1] = 20;
//     // t1.sum[2] = 30;
//     // t1.sum[3] = 40;

//     Test *t1 = new Test(10, 20); // 使用new关键字动态分配内存并调用构造函数
//     t1->sum[0] = 10; // 初始化sum数组的第一个元素
//     t1->sum[1] = 20; // 初始化sum数组的第二个元素
//     t1->sum[2] = 30; // 初始化sum数组的第三个元素
//     t1->sum[3] = 40; // 初始化sum数组的第四个元素
//     Test t2 = *t1; // 使用已构造的对象t1初始化新的对象t2
//     cout << "t2.x: " << t2.x << endl; // 输出t2的x值
//     cout << "t2.y: " << t2.y << endl; // 输出t2的y值
//     cout << "t1.sum " << t1->sum << endl;
//     cout << "t2.sum " << t2.sum << endl; // 输出t2的sum数组的第一个元素
    
//     delete t1;

//     cout << "t2.sum[0]: " << t2.sum[0] << endl; // 输出t2的sum数组的第一个元素
//     cout << "t2.sum[1]: " << t2.sum[1] << endl; // 输出t2的sum数组的第二个元素
//     cout << "t2.sum[2]: " << t2.sum[2] << endl; // 输出t2的sum数组的第三个元素
//     cout << "t2.sum[3]: " << t2.sum[3] << endl; // 输出t2的sum数组的第四个元素

//     return 0;
// }

/*===================================================编译器对属性和方法的处理& this指针===================================================*/
// class C1{
// public:
//     int i;
//     int j;
//     int k;
// protected:
// private:
// };

// class C2{
// public:
//     int i;
//     int j;
//     int k;
// public:
//     int getK(){return k;}
//     void setK(int val){k = val ;}
// };

// int main(){
//     //C1 c1;
//     C2 c2;

//     // cout << "Size of C1: " << sizeof(c1) << endl; // 输出C1的大小
//     // cout << "Size of C2: " << sizeof(c2) << endl; // 输出C2的大小

//     c2.k = 10;
//     c2.getK();

//     return 0;
// }

/*==========================================================静态成员变量============================================================*/
// class sheep{
//     public:
//         char name[20];
//         int age;

//         static int count; // 静态成员变量

//         sheep(){
//             count++;
//         }
//         ~sheep(){
//             count--;
//         }
// };
// int sheep::count = 0;

// int main(){
//     sheep *p = new sheep[10];
//     cout << "Number of sheep: " << sheep::count << endl; // 输出当前羊的数量
//     sheep s1;
//     cout << "Number of sheep after creating s1: " << sheep::count << endl; // 输出当前羊的数量
//     sheep s2;
//     cout << s1.count << s2.count << endl; // 输出s1和s2的count值
//     return 0;
// }

/*========================================================String============================================================*/
// int main(){
    // string str1;
    // cout << str1 << endl;
    // // cout << str1.size() << endl;
    // // cout << str1.length() << endl;
    // string str2 = "Hello, World!";
    // cout << str2 << endl;
    
    // const char * p = "world";
    // string str3 (p);//可以理解为构造函数是 string(const char *s)；

    // string str4(4,'K');
    // cout << str4 << endl; // 输出 "KKKK"

    // string str5("12345", 1, 3); // 这里的构造函数是 string(const char *s, size_type pos, size_type n);从下标1开始取3个构造
    // cout << str5 << endl; // 输出 "234"

    // return 0;
    // string s1("abcdef"), s2,s3;
    // s2.assign(s1, 2, 3); // 从s1的下标2开始取3个字符赋值给s2,也可以assign(s1);直接复制
    // cout << s2 << endl; // 输出 "cde"
    // s3.assign(3, 'x'); // 直接赋值3个字符'x'给s3
    // cout << s3 << endl; // 输出 "xxx"

//   ====================拼接============================
    // string str1 = "## temp = ";
    // string str2 ;
    // float temp = 36.5;
    // str2 = to_string(temp);// 将浮点数转换为字符串
    // string str3 = str1 + str2;
    // cout << str3 << endl; // 输出 "## temp = 36.500000"


    // string s1("123"),s2("abc");
    // s1.append(s2,1,2); // 从s2的下标1开始取2个字符追加到s1后面
    // cout << s1 << endl; // 输出 "123bc"
    // string s3 = s1;//append返回的值是一个原对象的引用，所以可以直接赋值给s3
    // s3.append(3,'K'); // 在s3后面追加3个字符'K'
    // cout << s3 << endl; // 输出 "123bcKKK"
    // s3.append("ABCDE",2,3); // 这里的ABCDE是一个字符串常量，表示从下标2开始取3个字符追加到s3后面
    // cout << s3 << endl;

//  ====================比较============================
    // string s1("hello"), s2("world");
    // bool result;
    // result = s1>s2; // 比较两个字符串的大小
    // if(result){
    //     cout << "s1 is greater than s2" << endl;
    // } else {
    //     cout << "s1 is not greater than s2" << endl;
    // }

    // cout << s1.compare(s1) << endl; // 比较s1和s1，返回0表示相等
    // cout << s1.compare(1,2,s2,1,2) << endl; // 比较s1的下标1开始的2个字符和s2的下标1开始的2个字符，返回0表示相等
    // cout << s1.compare(1,2,"abc",0,2) << endl; // 比较s1的下标1开始的2个字符和"abc"的下标0开始的2个字符，返回-1表示s1小于"abc"
    // cout << s1.compare("abc") << endl; // 比较s1和"abc"，返回1表示s1大于"abc"
    // cout << s1.compare(1,2,"and"); // 比较s1的下标1开始的2个字符和"and"，返回-1表示s1小于"and"


    //======================求子串============================
    // string s1("##temp==32.5;hum=67.6");
    // cout << s1.substr(0, 6) << endl; // 输出 "##temp"
    // //substr的构造函数是 string substr(size_type pos = 0, size_type n = npos) const;
    // string s2 = s1.substr(5);//如果不值当参数n，则从pos开始到字符串末尾的所有字符
    // cout << s2 << endl; // 输出 "==32.5;hum=67.6"
    // string s3 = s1.substr(0,s1.length());
    // cout << s3 << endl; // 输出 "##temp==32.5;hum=67.6"
    

    //======================查找============================
    // string s2 = "##temp==32.5;hum=67.6";
    // int pos;
    // pos = s2.find('=');
    // cout << pos <<endl; // 输出第一个'='的位置
    // int pos2;
    // if((pos2 = s2.find('x')) != string::npos){
    //     cout << pos2 << endl; // 输出'x'的位置
    // } else {
    //     cout << "no x" << endl; // 如果没有找到'x'
    // };
    // int pos3;
    // if((pos3 = s2.rfind("=")) != string::npos){
    //     cout << pos3 << endl; // 输出"="的位置(下标)
    // } else {
    //     cout << "no =" << endl; // 如果没有找到"="
    // };//实际使用情况中可以用于查找string类数组中的内容，因为find和rfind可以查找字符也可以查找字符串


    //======================替换===========================
    // string s1 = "Realize the dream of a better world";
    // s1.replace(2,5,"nonono",2,2);
    // cout << s1 << endl; // 输出 "Reno the dream of a better world"
    // s1.replace(2,3,5,'0'); // 从下标2开始替换3个字符为5个'0'
    // cout << s1 << endl; // 输出 "Re00000the dream of a better world"
    // int pos = s1.find("00000");
    // if(pos != string::npos) {
    //     s1.replace(pos,5,"dsj");
    //     cout << s1 << endl; // 输出 "Redsjthe dream of a better world"
    // }
    
    //======================删除==============================
    // string s1 = "Realize the dream of a better world";
    // s1.erase(2.5); // 从下标2开始删除5个字符
    // cout << s1 << endl; // 输出 "Reamize the dream of a better world"
    // string s2 = "Realize the dream of a better world";
    // s2.erase(6); // 从下标2开始删除到字符串末尾的所有字符
    // cout << s2 << endl; // 输出 "Reamize the dream of a better world"

    //======================插入==============================
    // string s1 = "Realize the dream of a better world";
    // s1.insert(2, "nonono");
    // cout << s1 << endl; // 输出 "Renononooize the dream of a better world"
    // string s2 = "000";
    // s1.insert(2,s2); // 在下标2的位置插入5个'0'
    // cout << s1 << endl; // 输出 "Re000nononooize the dream of a better world"
    // s1.insert(2, 5, '1'); // 在下标2的位置插入5个'0'
    // cout << s1 << endl; // 输出 "Re00011nononooize the dream of a better world"
    // s1.insert(2, "dsj", 0, 2); // 在下标2的位置插入"dsj"的前2个字符
    // cout << s1 << endl; // 输出 "Re00011dsononooize the dream of a better world"
    // s1.insert(2,s2,0,1); // 在下标2的位置插入s2的前1个字符
    // cout << s1 << endl; // 输出 "Re00011dsononooize the dream of a better world"
//     return 0;
// }


//===============================================================Array类======================================================================================
int main(){
    // Array a1;// 默认构造函数
    // Array a2(10); // 带参数的构造函数，创建一个大小为10的数组
    // Array a3(a2); // 拷贝构造函数，创建一个a2的副本
   
    // for(int i = 0; i < a2.get_size(); i++){
    //     cout << a2.get_data(i)<< ";"<< a3.get_data(i) << endl; // 输出a2和a3的元素
    // }

    //==================insert test======================
    // Array a;
    // a.insert(0,10);
    // a.insert(1,20);
    // a.insert(2,30);
    // a.insert(3,40);
    // // a.insert(4,50); // 这里会触发扩容
    // a.insert(10,200); 
    // a.insert(10,110);
    // a.insert(4,400);
    // for(int i = 0; i < a.get_size(); i++){
    //     cout << a.get_data(i) << endl; 
    // }
    // cout << "Array size: " << a.get_size() << endl; // 输出数组的大小
    // cout << "Item number: " << a.get_itemNum() << endl; // 输出实际存储的元素个数
 
 //======================remove_index test========================
    // Array a;
    // a.insert(0,10);
    // a.insert(1,20);
    // a.insert(2,30);
    // a.insert(3,40);
    // // a.insert(4,50); // 这里会触发扩容
    // a.insert(10,200); 
    // a.insert(10,110);
    // a.insert(4,400);
    // for(int i = 0; i < a.get_size(); i++){
    //     cout << a.get_data(i) << endl; 
    // }
    // cout << "Array size: " << a.get_size() << endl; // 输出数组的大小
    // cout << "Item number: " << a.get_itemNum() << endl; // 输出实际存储的元素个
    // a.remove_index(0); // 删除下标为0的元素
    // cout << "After removing index 0:" << endl;
    // for(int i = 0; i < a.get_size(); i++){
    //     cout << a.get_data(i) << endl; 
    // }
    // cout << "Array size: " << a.get_size() << endl; // 输出数组的大小
    // cout << "Item number: " << a.get_itemNum() << endl; // 输出实际存储的元素个数

    //======================remove_data test========================
    Array a;
    a.insert(0,10);
    a.insert(1,20);
    a.insert(2,20);
    a.insert(3,20);
    a.insert(10,200); 
    a.insert(10,110);
    a.insert(4,400);
    for(int i = 0; i < a.get_size(); i++){
        cout << a.get_data(i) << endl; 
    }
    cout << "Array size: " << a.get_size() << endl; // 输出数组的大小
    cout << "Item number: " << a.get_itemNum() << endl; // 输出实际存储的元素个数
    a.remove_data(20); // 删除值为20的元素
    cout << "After removing data 20:" << endl;
    for(int i = 0; i < a.get_size(); i++){
        cout << a.get_data(i) << endl; 
    }
    cout << "Array size: " << a.get_size() << endl; // 输出数组的大小
    cout << "Item number: " << a.get_itemNum() << endl; // 输出实际存储的元素个数
    return 0;
}